package com.color.admin.system.servie;

import com.color.admin.auth.entity.LoginDto;
import com.color.admin.common.core.page.PageRequest;
import com.color.admin.common.core.page.PageResponse;
import com.color.admin.system.entity.SysRole;
import com.color.admin.system.entity.SysUser;
import com.color.admin.system.entity.dto.PwdDto;
import com.color.admin.system.entity.dto.RestPwd;
import com.color.admin.system.entity.dto.UserDto;
import com.color.admin.system.entity.query.UserQueryCriteria;
import com.color.admin.system.entity.vo.user.UserSmallVo;
import com.color.admin.system.entity.vo.user.UserVo;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author HaiQiu
 * @date 2021/12/6
 */
public interface UserService {
    /**
     * 新增用户
     * @param sysUser 用户
     */
    void save(SysUser sysUser);

    /**
     * 登录
     * @param loginDto 登录实体
     * @return 返回登录相关信息
     */
    Map<String,Object> login(LoginDto loginDto);

    /**
     * 根据ID查询用户
     * @param userId 用户ID
     * @return 用户
     */
    UserVo get(String userId);


    /**
     * 分页查询也
     * @param request 请求参数
     * @return 用户列表
     */
    PageResponse<UserVo> list(PageRequest<UserQueryCriteria> request);

    /**
     * 删除用户
     * @param ids 用户ID数组
     */
    void delete(Set<String> ids);

    /**
     * 获取所有用户
     * @return 所有用户
     * @param typeId 可选参数：类型ID，可查询deptId，roleId，postId
     * @param type  可选参数：类型，0部门，1角色，2岗位
     * @param pageNum 可选参数：页数，不传默认查询全部
     * @param pageSize 可选参数：每页大小，不传默认查询全部
     */
    List<UserSmallVo> userAll(String typeId, Integer type, Integer pageNum, Integer pageSize);

    /**
     * 用户修改
     * @param sysUser 用户实体
     */
    void update(SysUser sysUser);

    /**
     * 批量重置密码
     * @param restPwds 批量数据
     * @return 成功条数
     */
    int restPwd(List<RestPwd> restPwds);

    /**
     * 根据角色ID查询关联的用户列表
     * @param roleIds 角色ID集合
     * @return 用户列表
     */
    List<SysUser> findUserByRoleIds(Set<String> roleIds);

    /**
     * 根据用户ID查询拥有的角色列表
     * @param userId 用户ID
     * @return 角色列表
     */
    Set<SysRole> findRolesByUserId(String userId);

    /**
     * 批量用户关联修改，主要修改用户绑定的部门，角色，岗位等信息修改
     * @param userDto 实体参数
     */
    void updateBatch(UserDto userDto);

    /**
     * 根据岗位ID查询关联的用户列表
     * @param postIds 岗位ID集合
     * @return 用户列表
     */
    List<SysUser> findUserByPostIds(Set<String> postIds);

    /**
     * 个人中心修改
     * @param sysUser 修改实体
     */
    void updateInfo(SysUser sysUser);

    /**
     * 退出登录
     */
    void loginOut();

    /**
     * security框架根据用户名查询用户
     * @param username 用户名
     * @return 用户
     */
    SysUser loadUserByUsername(String username);

    /**
     * 修改面膜
     * @param pwdDto 实体
     */
    void password(PwdDto pwdDto);
}
